package dingtalk

// 钉钉消息通知
// 工作通知消息：是以企业工作通知会话中某个微应用的名义推送到员工的通知消息，例如生日祝福、入职提醒等。
// 群消息：是指可以调用接口以系统名义向群里推送群聊消息。
// 普通消息：是指员工个人在使用应用时，可以通过界面操作的方式往群或其他人的会话里推送消息，例如发送日志的场景。
// https://ding-doc.dingtalk.com/doc#/serverapi2/al5qyp

// Markdown markdown消息
type Markdown struct {
	Msgtype  string `json:"msgtype"`
	Markdown struct {
		Title string `json:"title"`
		Text  string `json:"text"`
	} `json:"markdown"`
}

// Link 链接消息
type Link struct {
	Msgtype string `json:"msgtype"`
	Link    struct {
		MessageURL string `json:"messageUrl"`
		PicURL     string `json:"picUrl"`
		Title      string `json:"title"`
		Text       string `json:"text"`
	} `json:"link"`
}

// File 文件消息
// 注意，文件消息只支持文件下载，不支持在线预览。
type File struct {
	Msgtype string `json:"msgtype"`
	File    struct {
		MediaID string `json:"media_id"`
	} `json:"file"`
}

// Text 文本消息
type Text struct {
	Msgtype string `json:"msgtype"`
	Text    struct {
		Content string `json:"content"`
	} `json:"text"`
}

// Image 图片消息
type Image struct {
	Msgtype string `json:"msgtype"`
	Image   struct {
		MediaID string `json:"media_id"`
	} `json:"image"`
}

// Voice 语音消息
type Voice struct {
	Msgtype string `json:"msgtype"`
	Voice   struct {
		MediaID  string `json:"media_id"`
		Duration string `json:"duration"`
	} `json:"voice"`
}

// Oa OA消息
type Oa struct {
	Msgtype string `json:"msgtype"`
	Oa      struct {
		MessageURL string `json:"message_url"`
		Head       struct {
			Bgcolor string `json:"bgcolor"`
			Text    string `json:"text"`
		} `json:"head"`
		Body struct {
			Title string `json:"title"`
			Form  []struct {
				Key   string `json:"key"`
				Value string `json:"value"`
			} `json:"form"`
			Rich struct {
				Num  string `json:"num"`
				Unit string `json:"unit"`
			} `json:"rich"`
			Content   string `json:"content"`
			Image     string `json:"image"`
			FileCount string `json:"file_count"`
			Author    string `json:"author"`
		} `json:"body"`
	} `json:"oa"`
}

// ActionCardA 卡片消息
// 卡片消息支持整体跳转ActionCard样式和独立跳转ActionCard样式：
// （1）整体跳转ActionCardA样式，支持一个点击Action，需要传入参数 single_title和 single_url；
// （2）独立跳转ActionCardB样式，支持多个点击Action，需要传入参数 btn_orientation 和 btn_json_list；
type ActionCardA struct {
	Msgtype    string `json:"msgtype"`
	ActionCard struct {
		Title       string `json:"title"`
		Markdown    string `json:"markdown"`
		SingleTitle string `json:"single_title"`
		SingleURL   string `json:"single_url"`
	} `json:"action_card"`
}

// ActionCardB 卡片消息
// 卡片消息支持整体跳转ActionCard样式和独立跳转ActionCard样式：
// （1）整体跳转ActionCardA样式，支持一个点击Action，需要传入参数 single_title和 single_url；
// （2）独立跳转ActionCardB样式，支持多个点击Action，需要传入参数 btn_orientation 和 btn_json_list；
type ActionCardB struct {
	Msgtype    string `json:"msgtype"`
	ActionCard struct {
		Title          string `json:"title"`
		Markdown       string `json:"markdown"`
		BtnOrientation string `json:"btn_orientation"`
		BtnJSONList    []struct {
			Title     string `json:"title"`
			ActionURL string `json:"action_url"`
		} `json:"btn_json_list"`
	} `json:"action_card"`
}

// WorkNotificationV2 发送工作通知消息需要注意以下事项：
// 同一个应用相同消息的内容同一个用户一天只能接收一次。
// 同一个应用给同一个用户发送消息，企业内部开发方式一天不得超过500次。
// 通过设置to_all_user参数全员推送消息，一天最多3次。
// 超出以上限制次数后，接口返回成功，但用户无法接收到。详细的限制说明，请参考“工作通知消息的限制”。
// 该接口是异步发送消息，接口返回成功并不表示用户一定会收到消息，需要通过“查询工作通知消息的发送结果”接口查询是否给用户发送成功。
// 消息类型和样例可参考消息类型文档。
type WorkNotificationV2 struct {
	AgentID    int64       `json:"agent_id"`
	Msg        interface{} `json:"msg"`
	UseridList string      `json:"userid_list"`
	// DeptIDList string      `json:"dept_id_list"`
	// ToAllUser  bool        `json:"to_all_user"`
}

// WorkNotificationV2Rsp 工作消息通知返回结果
type WorkNotificationV2Rsp struct {
	Errcode   int    `json:"errcode"`
	Errmsg    string `json:"errmsg"`
	TaskID    int64  `json:"task_id"`
	RequestID string `json:"request_id"`
}

// WorkNotificationCancel 工作通知消息撤回
type WorkNotificationCancel struct {
	MsgTaskID int64 `json:"msg_task_id"`
	AgentID   int64 `json:"agent_id"`
}

// WorkNotificationCancelRsp 工作通知消息撤回返回结果
type WorkNotificationCancelRsp struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
}

// WorkNotificationGetSendProgress 查询工作通知消息的发送进度
type WorkNotificationGetSendProgress struct {
	TaskID  int64 `json:"task_id"`
	AgentID int64 `json:"agent_id"`
}

// WorkNotificationGetSendProgressRsp 查询工作通知消息的发送进度返回结果
type WorkNotificationGetSendProgressRsp struct {
	// 返回码
	Errcode int `json:"errcode"`
	// 对返回码的文本描述内容
	Errmsg   string `json:"errmsg"`
	Progress struct {
		// 取值 0-100，表示处理的百分比
		ProgressInPercent int `json:"progress_in_percent"`
		// 任务执行状态，0=未开始，1=处理中，2=处理完毕
		Status int `json:"status"`
	} `json:"progress"`
}

// WorkNotificationGetSendResult 查询工作通知消息的发送结果
type WorkNotificationGetSendResult struct {
	TaskID  int64 `json:"task_id"`
	AgentID int64 `json:"agent_id"`
}

// WorkNotificationGetSendResultRsp 查询工作通知消息的发送结果返回结果
type WorkNotificationGetSendResultRsp struct {
	SendResult struct {
		// InvalidUserIDList 无效的用户id
		InvalidUserIDList []string `json:"invalid_user_id_list"`
		// 	ForbiddenUserIDList 因发送消息超过上限而被流控过滤后实际未发送的userid。未被限流的接收者仍会被收到消息。限流规则包括：
		// 1.同一个微应用相同消息的内容同一个用户一天只能接收一次
		// 2.同一个微应用给同一个用户发送消息，
		// 如果是第三方企业应用，一天最多为50次；
		// 如果是企业内部开发方式，一天最多为500次
		ForbiddenUserIDList []string `json:"forbidden_user_id_list"`
		// FailedUserIDList 发送失败的用户id
		FailedUserIDList []string `json:"failed_user_id_list"`
		// ReadUserIDList 已读消息的用户id
		ReadUserIDList []string `json:"read_user_id_list"`
		// UnreadUserIDList 未读消息的用户id
		UnreadUserIDList []string `json:"unread_user_id_list"`
		// InvalidDeptIDList 无效的部门id
		InvalidDeptIDList []string `json:"invalid_dept_id_list"`
		ForbiddenList     struct {
			// Code 流控code。包括以下code：
			// 143105表示企业自建应用每日推送给用户的消息超过上限
			// 143106表示企业自建应用推送给用户的消息重复
			Code int `json:"code"`
			// Userid 被流控员工userId
			Userid string `json:"userId"`
			// Count 流控阀值
			Count int `json:"count"`
		} `json:" forbidden_list"`
	} `json:"send_result"`
	RequestID string `json:"request_id"`
	// 返回码
	Errcode int `json:"errcode"`
	// 对返回码的文本描述内容
	Errmsg string `json:"errmsg"`
}
